#ifndef TORRENT_H_
#define TORRENT_H_

#include <list>
#include <queue>
#include <string>

#include "ThreadTracker.h"
#include "ThreadPeersConectar.h"
#include "InformacionPieza.h"
#include "TorrentParser.h"
#include "RespuestaTracker.h"
#include "Mutex.h"
#include "ManejadorArchivos.h"

class Respuesta;
class InterfazPeer;
class TorrentInfo;
class Pieza;

using namespace std;

class Torrent
{
private:
	friend class ThreadPeersConectar;
	Mutex mutexPiezas;
	list<InformacionPieza*> piezas;

	Mutex mutexPiezasABajarOBajadas;
	list<unsigned long int> piezasPorBajar;
	list<unsigned long int> piezasBajadas;

	list<InterfazPeer*> listaPeerConectados;
	Condition conditionPeersConectados;

	queue<Peer> colaPeersPorConectar;
	Condition conditionPeersPorConectar;

	Condition conditionError;

	unsigned long long int bajado;
	unsigned long long int bajadoCorrecto;
	unsigned long long int subido;

	TorrentParser parser;
	TorrentInfo *info;

	string estado;
	string path;
	string idCliente;
	unsigned long int puerto;
	bool threadsArrancados;

	ThreadTracker *tTracker;
	ThreadPeersConectar *tPeersConectar;

	ManejadorArchivos* manejadorArchivos;

public:
	Torrent(const string &path, const string &idCliente, const unsigned long int puerto);
	virtual ~Torrent();

	string getPath();
	TorrentInfo* getTorrentInfo();
	unsigned long long int getBajado();

	void pausar(bool pausar);
	void reanudar();
	bool getPausado();
	void remover();
	list<unsigned long int> getPiezasBajadas();
	string getId();

	Pieza* asignarPiezaConMenosPeers(const string &idPeer);

};

#endif /* TORRENT_H_ */
